import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Code2 {
    /*
    多线程的第一种启动方式
    1.创建一个类 继承Thread类
    2.在类中重写run方法
    3.创建类的对象
    4.调用对象的start方法
    */

//    public static void main(String[] args) {
//        MyThread myThread = new MyThread();
//        MyThread myThread2 = new MyThread();
//        myThread.setName("MyThread1");
//        myThread2.setName("MyThread2");
//        myThread.start();
//        myThread2.start();
//
//    }
//    public static class MyThread extends Thread{
//        @Override
//        public void run() {
//            for (int i = 0; i < 100; i++) {
//                System.out.println("子线程"+"="+this.getName()+"="+i);
//            }
//        }
//    }

    /*
     * 多线程的第二种启动方式
     * 1.创建一个类 实现Runnable接口
     * 2.在类中重写run方法
     * 3.创建类的对象
     * 4.创建Thread类的对象，把类的对象作为构造方法的参数
     * 5.调用Thread类的对象的start方法
     * */

//    public static void main(String[] args) {
//        MyRunnable myRunnable = new MyRunnable();
//        Thread thread = new Thread(myRunnable);
//        Thread thread2 = new Thread(myRunnable);
//        thread.setName("MyThread1");
//        thread2.setName("MyThread2");
//        thread.start();
//        thread2.start();
//    }
//    public static class MyRunnable implements Runnable{
//        @Override
//        public void run() {
//            for (int i = 0; i < 100; i++) {
//                // Thread.currentThread() 获取当前线程的对象
//                System.out.println("子线程"+"="+Thread.currentThread().getName()+"="+i);
//            }
//        }
//    }


    /*
     * 多线程的第三种启动方式
     * 可以获取到多线程运行的结果
     * 1.创建一个类MyCallable 实现Runnable接口
     * 2.重写call （是有返回值的，表示多线程的运行结果）
     * 3.创建MyCallable对象 （表示多线程要执行的任务）
     * 4.创建FutureTask对象 （作用：管理多线程的运行结果）
     * 5.创建Thread对象，并启动（线程启动）
     * */
//    public static void main(String[] args) {
//        MyRunnable myRunnable = new MyRunnable();
//        FutureTask<Integer> futureTask = new FutureTask<>(myRunnable);
//        Thread thread = new Thread(futureTask);
//        thread.start();
//        try {
//            Integer sum = futureTask.get();
//            System.out.println(sum);
//        } catch (InterruptedException | ExecutionException e) {
//            e.printStackTrace();
//        }
//    }
//
//    public static class MyRunnable implements Callable<Integer> {
//        @Override
//        public Integer call() throws Exception {
//            int sum = 0;
//            for (int i = 1; i <= 100; i++) {
//                sum += i;
//            }
//            return sum;
//        }
//    }


    /*
    * getName() 可以获取线程的名称
    * 线程会有默认名称 格式: Thread-X (X从0开始)
    *
    * setName() 可以设置线程的名称
    *
    * Thread("name") Thread类的构造方法 也可以使用有参构造设置线程名称
    * 继承的类 该方法需要手动设置
    *
    * Thread.currentThread() 获取当前线程的对象
    * 当jvm启动时 会默认创建一个主线程（main线程）
    * 它的作用是执行main方法
    * 我们所有写的代码 都是在主线程(main)中执行的
    *
    * Thread.sleep() 可以使当前线程进入阻塞状态
    * 阻塞状态的线程 不会参与cpu的调度
    * */
//    public static void main(String[] args) {
////        MyThread myThread = new MyThread();
////        myThread.setName("MyThread1");
////        myThread.start();
//
//        MyThread myThread = new MyThread("飞机");
//        MyThread myThread2 = new MyThread("大炮");
//        myThread.start();
//        myThread2.start();
//
////        try {
////            Thread.sleep(3000);
////        } catch (InterruptedException e) {
////            e.printStackTrace();
////        }
////        System.out.println("主线程"+Thread.currentThread().getName()+"执行完毕");
//    }

//    public static class MyThread extends Thread{
//        public MyThread(String name) {
//            super(name);
//        }
//        @Override
//        public void run() {
//            for (int i = 0; i < 100; i++) {
//                try {
//                    Thread.sleep(1000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println(this.getName()+"="+i);
//            }
//        }
//    }
}